﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.IO.IsolatedStorage;
using System.IO;
using System.Text;
using Microsoft.Phone.Net.NetworkInformation;


namespace NearChat
{
    public partial class CreateAccount : PhoneApplicationPage
    {
        //storage dell'applicazione
        private static IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings;

        //dati del form
        private string user = "";
        private string psw = "";
        private string mail = "";
        private string sesso = "";
        private string nascita = "";

        public CreateAccount()
        {
            InitializeComponent();
        }

        private void buttonCrea_Tap(object sender, GestureEventArgs e)
        {
            bool isCorrect = true; 

            //raccolgo i campi
            user = userBox.Text.ToString().ToLower();
            string psw1 = psw1Box.Password;
            string psw2 = psw2Box.Password;
            mail = mailBox.Text.ToString();
            nascita = NascitaBox.Text.ToString();
            psw = psw1;

            //controllo validità doppia password
            if (psw1 != "" && psw2 != "")
            {
                if (psw1 != psw2)
                    isCorrect = false; //password doppia non corretta
            }
            else//se una delle due vuote
                isCorrect = false;

            //controllo user, tolgo i caratteri che mi servono successivamente
            if (user != "")
            {
                user.Replace('|', '/');
                user.Replace('§', 'ç');
            }
            else
                isCorrect = false;

            //controllo mail
            if (mail != "")
            {
                var regEx = new System.Text.RegularExpressions.Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
                if (regEx.IsMatch(mail) == false)//non rispetta l'espressione regolare
                    isCorrect = false;//mail non corretta
            }
            else
                isCorrect = false;

            //controllo data nascita mm.dd.yyyy
            if (nascita != "" && nascita != "mm.dd.yyyy")
            {
                if (nascita.Length != 10)
                    isCorrect = false;//data di nascita sbagliata

                if ((nascita[2] == '.' && nascita[5] == '.') || (nascita[2] == '/' && nascita[5] == '/'))//va bene
                { /*formato data corretto*/}
                else
                    isCorrect = false;//formattazione data di nascita sbagliata

                try
                {
                    DateTime d = DateTime.Parse(nascita);//la casto e controllo le eccezzioni
                }
                catch (FormatException)
                {
                    isCorrect = false;//data non esistente
                }

                //ho passato tutti i controlla la formatto per il DB
                string anno = nascita.Substring(6, 4);
                nascita = nascita.Replace('.', '-');
                nascita = nascita.Replace('/', '-');
                nascita = anno + "-" + nascita.Substring(0, 5);
            }
            else isCorrect = false;

            if (isCorrect)//ho passsato i controlli e i campi sono salvati
            {
                if (NetworkInterface.GetIsNetworkAvailable())
                {
                    //faccio request PHP al DB
                    Uri myDBuri = new Uri("http://www.nearchat.altervista.org/createAccount.php");
                    HttpWebRequest createRequest = (HttpWebRequest)HttpWebRequest.Create(myDBuri);
                    createRequest.Method = "POST";
                    createRequest.ContentType = "application/x-www-form-urlencoded";
                    createRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), createRequest);
                }
                else
                    MessageBox.Show("connection error, please retry later.");
            }
            else
                MessageBox.Show("uncorrect field");    
        }

        private void userBox_Tap(object sender, GestureEventArgs e)
        {
            MessageBox.Show("please not use special chars");
        }

        private void NascitaBox_Tap(object sender, GestureEventArgs e)
        {
            NascitaBox.Text = "";
        }

        void GetRequestStreamCallback(IAsyncResult callbackResult)
        {
            HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
            // End the stream request operation
            Stream postStream = myRequest.EndGetRequestStream(callbackResult);

            // Create the post data
            string postData = "apikey=4nn!eSupp0rt&user=" + user.ToString() + "&psw=" + psw.ToString() + "&mail=" + mail.ToString() + "&sesso=" + sesso.ToString() + "&ddn=" + nascita.ToString();
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            // Add the post data to the web request
            postStream.Write(byteArray, 0, byteArray.Length);
            postStream.Close();

            // Start the web request
            myRequest.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), myRequest);
        }//GetRequestStreamCallback

        void GetResponsetStreamCallback(IAsyncResult callbackResult)
        {
            HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
            using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()))
            {
                string result = httpWebStreamReader.ReadToEnd();
                Dispatcher.BeginInvoke(() => ParsingCreate(result));
            }
        }//GetResponsetStreamCallback

        void ParsingCreate(string result)
        {
            string[] ris = majorSplit(result);
            ris = minorSplit(ris[0]);//sono sicuro che rappresenta un solo record

            if (ris[0] == "ERRORE")
            {
                MessageBox.Show(ris[1]);
            }
            else //se login effettuato
            {
                //aggiungo i dati in locale
                appSettings.Add("user", user);

                //torno indietro alla main page
                NavigationService.GoBack();//cambio della pagina
            }
        }//ParsingCreate

        private void RadioM_Checked(object sender, RoutedEventArgs e)
        {
            sesso = "M";
        }

        private void RadioF_Checked(object sender, RoutedEventArgs e)
        {
            sesso = "F";
        }

        //splitta la stringa passata in base a |
        private string[] minorSplit(string result)
        {
            return result.Split('|');
        }

        //splitta la stringa passata in base a §
        private string[] majorSplit(string result)
        {
            return result.Split('§');
        }
    }
}